module et{
    export abstract class IAwakeSystem{
        get Type(){
            return Object.getPrototypeOf(this);
        }
    }
    export abstract class IAwakeSystem1 extends IAwakeSystem
	{
		abstract run(o):void;
    }
    export abstract class IAwakeSystem2<A> extends IAwakeSystem{
        abstract run(o, a:A):void;
    }
    export abstract class IAwakeSystem3<A,B> extends IAwakeSystem{
        abstract run(o, a:A,b:B):void;
    }
    export abstract class IAwakeSystem4<A,B,C> extends IAwakeSystem{
        abstract run(o, a:A,b:B,c:C):void;
    }
    export abstract  class AwakeSystem<T> extends IAwakeSystem1{
        run(o):void{
            this.awake(o);
        }
        abstract  awake(self:T):void;
    }
    export abstract  class AwakeSystem1<T,A> extends IAwakeSystem2<A>{
        run(o,a:A):void{
            this.awake(o,a);
        }
        abstract  awake(self:T,a:A):void;
    }
    export abstract  class AwakeSystem2<T,A,B> extends IAwakeSystem3<A,B>{
        run(o,a:A,b:B):void{
            this.awake(o,a,b);
        }
        abstract  awake(self:T,a:A,b:B):void;
    }
    export abstract  class AwakeSystem3<T,A,B,C> extends IAwakeSystem4<A,B,C>{
        run(o,a:A,b:B,c:C):void{
            this.awake(o,a,b,c);
        }
        abstract  awake(self:T,a:A,b:B,c:C):void;
    }
}